home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 15 / CU Amiga Magazine's Super CD-ROM 15 (1997)(EMAP Images)(GB)[!][issue 1997-10].iso / CUCD / Graphics / Ghostscript / source / gs_cff.ps < prev    next >
Text File  |  1997-04-11  |  18KB  |  578 lines

  1. %    Copyright (C) 1997 Aladdin Enterprises.  All rights reserved.
  2. % This file is part of Aladdin Ghostscript.
  3. % Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  4. % or distributor accepts any responsibility for the consequences of using it,
  5. % or for whether it serves any particular purpose or works at all, unless he
  6. % or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  7. % License (the "License") for full details.
  8. % Every copy of Aladdin Ghostscript must include a copy of the License,
  9. % normally in a plain ASCII text file named PUBLIC.  The License grants you
  10. % the right to copy, modify and redistribute Aladdin Ghostscript, but only
  11. % under certain conditions described in the License.  Among other things, the
  12. % License requires that the copyright notice and this notice be preserved on
  13. % all copies.
  14.  
  15. % Loader for CFF (compressed) fonts.
  16. % The following are not implemented yet:
  17. %    Deleted entries in the Name Index
  18. %    Embedded PostScript
  19. %    Multiple Master fonts
  20. %    CIDFonts
  21. %    Chameleon fonts
  22. %    Non-standard Encodings
  23. %    Synthetic fonts
  24. % Also, Type 2 charstrings are converted into Type 1 fonts with
  25. % CharstringType = 2, which may or may not be supported.
  26.  
  27. 30 dict begin
  28.  
  29. % ---------------- Standard strings (actually names) ---------------- %
  30.  
  31. /StandardStrings mark
  32. % 0
  33.   /.notdef /space /exclam /quotedbl /numbersign
  34.   /dollar /percent /ampersand /quoteright /parenleft
  35.   /parenright /asterisk /plus /comma /hyphen
  36.   /period /slash /zero /one /two
  37.   /three /four /five /six /seven
  38.   /eight /nine /colon /semicolon /less
  39.   /equal /greater /question /at /A
  40.   /B /C /D /E /F
  41.   /G /H /I /J /K
  42.   /L /M /N /O /P
  43. % 50
  44.   /Q /R /S /T /U
  45.   /V /W /X /Y /Z
  46.   /bracketleft /backslash /bracketright /asciicircum /underscore
  47.   /quoteleft /a /b /c /d
  48.   /e /f /g /h /i
  49.   /j /k /l /m /n
  50.   /o /p /q /r /s
  51.   /t /u /v /w /x
  52.   /y /z /braceleft /bar /braceright
  53.   /asciitilde /exclamdown /cent /sterling /fraction
  54. % 100
  55.   /yen /florin /section /currency /quotesingle
  56.   /quotedblleft /guillemotleft /guilsinglleft /guilsinglright /fi
  57.   /fl /endash /dagger /daggerdbl /periodcentered
  58.   /paragraph /bullet /quotesinglbase /quotedblbase /quotedblright
  59.   /guillemotright /ellipsis /perthousand /questiondown /grave
  60.   /acute /circumflex /tilde /macron /breve
  61.   /dotaccent /dieresis /ring /cedilla /hungarumlaut
  62.   /ogonek /caron /emdash /AE /ordfeminine
  63.   /Lslash /Oslash /OE /ordmasculine /ae
  64.   /dotlessi /lslash /oslash /oe /germandbls
  65. % 150
  66.   /onesuperior /logicalnot /mu /trademark /Eth
  67.   /onehalf /plusminus /Thorn /onequarter /divide
  68.   /brokenbar /degree /thorn /threequarters /twosuperior
  69.   /registered /minus /eth /multiply /threesuperior
  70.   /copyright /Aacute /Acircumflex /Adieresis /Agrave
  71.   /Aring /Atilde /Ccedilla /Eacute /Ecircumflex
  72.   /Edieresis /Egrave /Iacute /Icircumflex /Idieresis
  73.   /Igrave /Ntilde /Oacute /Ocircumflex /Odieresis
  74.   /Ograve /Otilde /Scaron /Uacute /Ucircumflex
  75.   /Udieresis /Ugrave /Yacute /Ydieresis /Zcaron
  76. % 200
  77.   /aacute /acircumflex /adieresis /agrave /aring
  78.   /atilde /ccedilla /eacute /ecircumflex /edieresis
  79.   /egrave /iacute /icircumflex /idieresis /igrave
  80.   /ntilde /oacute /ocircumflex /odieresis /ograve
  81.   /otilde /scaron /uacute /ucircumflex /udieresis
  82.   /ugrave /yacute /ydieresis /zcaron /exclamsmall
  83.   /Hungarumlautsmall /dollaroldstyle /dollarsuperior /ampersandsmall /Acutesmall
  84.   /parenleftsuperior /parenrightsuperior /twodotenleader /onedotenleader /zerooldstyle
  85.   /oneoldstyle /twooldstyle /threeoldstyle /fouroldstyle /fiveoldstyle
  86.   /sixoldstyle /sevenoldstyle /eightoldstyle /nineoldstyle /commasuperior
  87. % 250
  88.   /threequartersemdash /periodsuperior /questionsmall /asuperior /bsuperior
  89.   /centsuperior /dsuperior /esuperior /isuperior /lsuperior
  90.   /msuperior /nsuperior /osuperior /rsuperior /ssuperior
  91.   /tsuperior /ff /ffi /ffl /parenleftinferior
  92.   /parenrightinferior /Circumflexsmall /hyphensuperior /Gravesmall /Asmall
  93.   /Bsmall /Csmall /Dsmall /Esmall /Fsmall
  94.   /Gsmall /Hsmall /Ismall /Jsmall /Ksmall
  95.   /Lsmall /Msmall /Nsmall /Osmall /Psmall
  96.   /Qsmall /Rsmall /Ssmall /Tsmall /Usmall
  97.   /Vsmall /Wsmall /Xsmall /Ysmall /Zsmall
  98. % 300
  99.   /colonmonetary /onefitted /rupiah /Tildesmall /exclamdownsmall
  100.   /centoldstyle /Lslashsmall /Scaronsmall /Zcaronsmall /Dieresissmall
  101.   /Brevesmall /Caronsmall /Dotaccentsmall /Macronsmall /figuredash
  102.   /hypheninferior /Ogoneksmall /Ringsmall /Cedillasmall /questiondownsmall
  103.   /oneeighth /threeeighths /fiveeighths /seveneighths /onethird
  104.   /twothirds /zerosuperior /foursuperior /fivesuperior /sixsuperior
  105.   /sevensuperior /eightsuperior /ninesuperior /zeroinferior /oneinferior
  106.   /twoinferior /threeinferior /fourinferior /fiveinferior /sixinferior
  107.   /seveninferior /eightinferior /nineinferior /centinferior /dollarinferior
  108.   /periodinferior /commainferior /Agravesmall /Aacutesmall /Acircumflexsmall
  109. % 350
  110.   /Atildesmall /Adieresissmall /Aringsmall /AEsmall /Ccedillasmall
  111.   /Egravesmall /Eacutesmall /Ecircumflexsmall /Edieresissmall /Igravesmall
  112.   /Iacutesmall /Icircumflexsmall /Idieresissmall /Ethsmall /Ntildesmall
  113.   /Ogravesmall /Oacutesmall /Ocircumflexsmall /Otildesmall /Odieresissmall
  114.   /OEsmall /Oslashsmall /Ugravesmall /Uacutesmall /Ucircumflexsmall
  115.   /Udieresissmall /Yacutesmall /Thornsmall /Ydieresissmall (001.000)
  116.   (001.001) (001.002) (001.003) /Black /Bold
  117.   /Book /Light /Medium /Regular /Roman
  118.   /Semibold
  119. .packtomark def
  120.  
  121. % ---------------- Standard encodings ---------------- %
  122.  
  123. /StandardEncodings [
  124.  
  125. % StandardEncoding
  126. mark
  127.   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  128.   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  129.   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
  130.   17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
  131.   33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
  132.   49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
  133.   65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
  134.   81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 0
  135.   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  136.   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  137.   0 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
  138.   0 111 112 113 114 0 115 116 117 118 119 120 121 122 0 123
  139.   0 124 125 126 127 128 129 130 131 0 132 133 0 134 135 136
  140.   137 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  141.   0 138 0 139 0 0 0 0 140 141 142 143 0 0 0 0
  142.   0 144 0 0 0 145 0 0 146 147 148 149 0 0 0 0
  143. .packtomark
  144.  
  145. % ExpertEncoding
  146. mark
  147.   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  148.   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  149.   1 229 230 0 231 232 233 234 235 236 237 238 13 14 15 99
  150.   239 240 241 242 243 244 245 246 247 248 27 28 249 250 251 252
  151.   0 253 254 255 256 257 0 0 0 258 0 0 259 260 261 262
  152.   0 0 263 264 265 0 266 109 110 267 268 269 0 270 271 272
  153.   273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
  154.   289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 0
  155.   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  156.   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  157.   0 304 305 306 0 0 307 308 309 310 311 0 312 0 0 313
  158.   0 0 314 315 0 0 316 317 318 0 0 0 158 155 163 319
  159.   320 321 322 323 324 325 0 0 326 150 164 169 327 328 329 330
  160.   331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346
  161.   347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362
  162.   363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378
  163. .packtomark
  164.  
  165. ] readonly def
  166.  
  167. % ---------------- Standard Charsets ---------------- %
  168.  
  169. % We include an explicit 0 at the beginning of each charset.
  170.  
  171. /StandardCharsets [
  172.  
  173. % ISOAdobe
  174. mark
  175.   0
  176.   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
  177.   17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
  178.   33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
  179.   49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
  180.   65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
  181.   81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
  182.   97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
  183.   113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
  184.   129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
  185.   145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
  186.   161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
  187.   177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
  188.   193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
  189.   209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224
  190.   225 226 227 228
  191. .packtomark
  192.  
  193. % Expert
  194. mark
  195.   0
  196.   1 229 230 231 232 233 234 235 236 237 238 13 14 15 99 239
  197.   240 241 242 243 244 245 246 247 248 27 28 249 250 251 252 253
  198.   254 255 256 257 258 259 260 261 262 263 264 265 266 109 110 267
  199.   268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283
  200.   284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299
  201.   300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315
  202.   316 317 318 158 155 163 319 320 321 322 323 324 325 326 150 164
  203.   169 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341
  204.   342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357
  205.   358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373
  206.   374 375 376 377 378
  207. .packtomark
  208.  
  209. % ExpertSubset
  210. mark
  211.   0
  212.   1 231 232 235 236 237 238 13 14 15 99 239 240 241 242 243
  213.   244 245 246 247 248 27 28 249 250 251 253 254 255 256 257 258
  214.   259 260 261 262 263 264 265 266 109 110 267 268 269 270 272 300
  215.   301 302 305 314 315 158 155 163 320 321 322 323 324 325 326 150
  216.   164 169 327 328 329 330 331 332 333 334 335 336 337 338 339 340
  217.   341 342 343 344 345 346
  218. .packtomark
  219.  
  220. ] readonly def
  221.  
  222. % ---------------- Font loading ---------------- %
  223.  
  224. % ------ Utilities ------ %
  225.  
  226. /advance {    % <n> advance -
  227.   f cff eq { /pos pos 3 -1 roll add store } { pop } ifelse
  228. } def
  229. /next {        % - next <byte>
  230.   f read { 1 advance } if
  231. } def
  232. /nextstring {    % <length> nextstring <string>
  233.   string f exch readstring pop dup length advance
  234. } def
  235. /card8        % - card8 <card8>
  236.  /next load
  237. def
  238. /card16 {    % - card16 <card16>
  239.   card8 8 bitshift card8 add
  240. } def
  241. /offset {    % <offsize> offset <offset>
  242.   0 exch { 8 bitshift next add } repeat
  243. } def
  244. /sid        % - <sid> sid
  245.   /card16 load
  246. def
  247. /Index {    % - Index <array>
  248.   mark card16 dup 0 ne {
  249.     1 exch next dup offset pop exch {
  250.       dup offset dup 4 -1 roll sub 3 1 roll exch
  251.     } repeat pop
  252.   } if pop .packtomark
  253.   [ exch { nextstring } forall ] readonly
  254. } def
  255. /tokens {    % - tokens <num1> ... <op#> (op# = 12 means EOF)
  256.   {
  257.     f read not { 12 exit } if
  258.     1 advance
  259.     dup 12 eq { next 32 add exit } if
  260.     dup 28 lt { exit } if
  261.     dup 32 lt {
  262.       28 sub {
  263.     { card16 32768 xor 32768 sub }
  264.     { 4 offset dup 16#7fffffff gt { -1 32 bitshift add } if }
  265.     { tokenreal }
  266.     { 31 exit }
  267.       } exch get exec
  268.     } {
  269.       dup 247 lt {
  270.     139 sub
  271.       } {
  272.     247 sub {
  273.       { next 108 add }
  274.       { next 364 add }
  275.       { next 620 add }
  276.       { next 876 add }
  277.       { next 108 add neg }
  278.       { next 364 add neg }
  279.       { next 620 add neg }
  280.       { next 876 add neg }
  281.       % 255 is deliberately omitted and will cause a rangecheck
  282.     } exch get exec
  283.       } ifelse
  284.     } ifelse
  285.   } loop
  286. } def
  287. /tokenbuf 100 string def
  288. /tokenput {    % <index> <char> tokenput <index+1>
  289.   tokenbuf 2 index 3 -1 roll put 1 add
  290. } def
  291. /tokenrealarray [
  292.  (0123456789.E) { } forall
  293.  [(E) 0 get /tokenput cvx (-) 0 get] cvx
  294.  null        % will give an error
  295.  (-) 0 get
  296.  { exit }
  297. ] readonly def
  298. /tokenreal {    % - tokenreal <float>
  299.   0 {
  300.     next exch 1 index -4 bitshift tokenrealarray exch get exec tokenput
  301.     exch 15 and tokenrealarray exch get exec tokenput
  302.   } loop
  303.   tokenbuf 0 3 -1 roll getinterval cvr exch pop
  304. } def
  305. /Dict {        % <opsdict> Dict -
  306.   /opdict exch store {
  307.     mark tokens opdict exch .knownget { exec } if cleartomark
  308.   } loop cleartomark
  309. } def
  310. /idstring {    % <sid> idstring <string>
  311.   dup 391 lt { StandardStrings } { 391 sub strings } ifelse exch get
  312. } def
  313.  
  314. % ------ Top dictionary ------ %
  315.  
  316. /offput {    % <offset> <proc> offput -
  317.   currentdict exch aload length 1 add packedarray cvx
  318.   offsets 3 1 roll put
  319. } def
  320. /queueput {    % <font> <proc> queueput -
  321.   16#7fffffff offsets { pop .min } forall
  322.   pos sub nextstring
  323.   3 1 roll aload length 2 add packedarray cvx
  324.   [ queued aload pop counttomark 2 add -1 roll ]
  325.   /queued exch store
  326. } def
  327. /xxput {    % <value> <key> <dict> xxput -
  328.   3 1 roll exch put
  329. } def
  330. /putfi {    % <value> <key> putfi -
  331.   FontInfo xxput
  332. } def
  333. /xdef {        % <value> <key> xdef -
  334.   exch def
  335. } def
  336. /topdictops mark
  337.   12 { exit }
  338.   0 { idstring /version putfi }
  339.   1 { idstring /Notice putfi }
  340.   32 { idstring /Copyright putfi }
  341.   2 { idstring /FullName putfi }
  342.   3 { idstring /FamilyName putfi }
  343.   4 { idstring /Weight putfi }
  344.   33 { 0 ne /isFixedPitch putfi }
  345.   34 { /ItalicAngle putfi }
  346.   35 { /UnderlinePosition putfi }
  347.   36 { /UnderlineThickness putfi }
  348.   37 { /PaintType xdef }
  349.   38 { /CharstringType xdef }
  350.   39 { /FontMatrix xdef }
  351.   13 { /UniqueID xdef }
  352.   5 { counttomark array astore /FontBBox xdef }
  353.   40 { /StrokeWidth xdef }
  354.   14 { counttomark array astore /XUID xdef }
  355.   15 {
  356.     dup StandardCharsets length lt {
  357.       StandardCharsets exch get /charset xdef
  358.     } {
  359.       { queuecharset } offput
  360.     } ifelse
  361.   }
  362.   16 {
  363.     dup StandardEncodings length lt {
  364.       /Encoding xdef
  365.     } {
  366.       { queueEncoding } offput
  367.     } ifelse
  368.   }
  369.   17 { { readCharStrings } offput }
  370.   18 { exch /readPrivate cvx 2 packedarray offput }
  371. .dicttomark readonly def
  372.  
  373. /readCharStrings {    % <font> readCharStrings -
  374.   /CharStringArray Index put
  375. } def
  376.  
  377. % ------ Charsets and encodings ------ %
  378.  
  379. % Note: formats 1 and 2 can overflow the operand stack.
  380. % We'll fix this if it ever becomes necessary.
  381. /charsetformats [
  382. { [ 0 CharStringArray length 1 sub { sid } repeat ]
  383. }
  384. { [ 0 CharStringArray length 1 sub {
  385.     dup 0 eq { pop exit } if
  386.     sid card8 1 add 2 index .min { exch 1 sub 1 index 1 add } repeat pop
  387.   } loop ]
  388. }
  389. { [ 0 CharStringArray length 1 sub {
  390.     dup 0 eq { pop exit } if
  391.     sid card16 1 add 2 index .min { exch 1 sub 1 index 1 add } repeat pop
  392.   } loop ]
  393. }
  394. ] readonly def
  395. /queuecharset {        % <font> queuecharset -
  396.   { readcharset } queueput
  397. } def
  398. /readcharset {        % <data> <font> readcharset -
  399.   begin 0 () /SubFileDecode filter /f exch store
  400.   charsetformats next get exec /charset exch def end
  401. } def
  402.  
  403. /queueEncoding {    % <font> queueEncoding -
  404.   { readEncoding } queueput
  405. } def
  406. /readEncoding {        % <data> <font> readEncoding -
  407.     % NOT IMPLEMENTED YET
  408.   (****readEncoding: ) print 1 index ===
  409.   /Encoding StandardEncodings 0 get put pop
  410. } def
  411.  
  412. % ------ Private dictionary ------ %
  413.  
  414. /deltarray {        % -mark- <num1> ... deltarray <num1'> ...
  415.   0 counttomark 1 sub { counttomark -1 roll add dup } repeat pop
  416.   counttomark array astore
  417. } def
  418.  
  419. /privatedictops mark
  420.   12 { exit }
  421.   6 { deltarray /BlueValues xdef }
  422.   7 { deltarray /OtherBlues xdef }
  423.   8 { deltarray /FamilyBlues xdef }
  424.   9 { deltarray /FamilyOtherBlues xdef }
  425.   41 { /BlueScale xdef }
  426.   42 { /BlueShift xdef }
  427.   43 { /BlueFuzz xdef }
  428.   10 { 1 array astore /StdHW xdef }
  429.   11 { 1 array astore /StdVW xdef }
  430.   44 { deltarray /StemSnapH xdef }
  431.   45 { deltarray /StemSnapV xdef }
  432.   46 { 0 ne /ForceBold xdef }
  433.   47 { /ForceBoldThreshold xdef }
  434.   48 { /lenIV xdef }
  435.   49 { /LanguageGroup xdef }
  436.   50 { /ExpansionFactor xdef }
  437.   51 { /initialRandomSeed xdef }
  438.   19 { { readSubrs } offput }
  439.   20 { /defaultWidthX xdef }
  440.   21 { /nominalWidthX xdef }
  441.     % Multiple Master fonts only
  442.   59 { /NDV xdef }
  443.   60 { /CDV xdef }
  444.   61 { /lenBuildCharArray xdef }
  445. .dicttomark readonly def
  446.  
  447. /readPrivate {        % <font> <size> readPrivate -
  448.   exch 1 index f exch () /SubFileDecode filter /f exch def
  449.   /Private get begin //privatedictops Dict end
  450.   /f cff def advance
  451. } def
  452.  
  453. % ------ Main program ------ %
  454.  
  455. % We need to pass the file as a parameter for the sake of the PDF
  456. % interpreter.
  457. /StartData {        % <resname> <nbytes> StartData -
  458.   currentfile exch () /SubFileDecode filter ReadData
  459. } def
  460. /ReadData {        % <resname> <file> ReadData -
  461.  
  462.     % Initialize.
  463.  
  464.   30 dict begin
  465.   /cff exch def
  466.   /pos 0 def
  467.   /resname exch cvlit def
  468.  
  469.     % Read the header.
  470.  
  471.   /f cff def
  472.   /vmajor next def
  473.   /vminor next def
  474.   /hdrsize next def
  475.   /aoffsize next def
  476.  
  477.     % Read the Indexes.
  478.  
  479.   /names Index def
  480.   /topdicts Index def
  481.   /strings Index def
  482.   /gsubrs Index def
  483.  
  484.     % Read the top Dicts.
  485.  
  486.   /offsets 50 dict def
  487.   /queued [] def
  488.   /opdict null def        % reserve a slot
  489.   /fonts [ topdicts {
  490.     0 () /SubFileDecode filter /f exch def
  491.     40 dict begin
  492.         % Preload defaults that differ from PostScript defaults.
  493.       /FontType 1 def
  494.       /CharstringType 2 def
  495.       /FontMatrix [0.001 0 0 0.001 0 0] def
  496.       /charset StandardCharsets 0 get def
  497.       /Encoding 0 def
  498.       /FontInfo 10 dict
  499.     dup /UnderlinePosition -100 put
  500.     dup /UnderlineThickness 50 put
  501.       def
  502.       /Private 20 dict
  503.     gsubrs length 0 ne { dup /GlobalSubrs gsubrs put } if
  504.       def
  505.       //topdictops Dict
  506.     currentdict end
  507.   } forall ] def
  508.  
  509.     % Read other tables with queued offsets.
  510.  
  511.   { /f cff def
  512.     offsets pos 2 copy .knownget not { pop pop exit } if
  513.     3 1 roll undef exec
  514.   } loop
  515.   offsets length 0 ne {
  516.     (Error: missing tables at ) print [ offsets { pop } forall ] ==
  517.     (Current position is ) print pos ==
  518.     flush stop
  519.   } if
  520.  
  521.     % Process out-of-order tables.
  522.  
  523.   queued { exec } forall
  524.  
  525.     % Update Encoding and CharStrings.
  526.  
  527.   fonts {
  528.     begin
  529.         % Construct the real Encoding.
  530.         % The value of Encoding is either a number, for predefined
  531.         % encodings, or an array of GIDs.
  532.       /Encoding mark Encoding dup type /integertype eq {
  533.     StandardEncodings exch get { idstring } forall
  534.       } {
  535.     { charset exch get idstring } forall
  536.       } ifelse .packtomark def
  537.         % Construct the CharStrings.
  538.       /CharStrings charset length dict def
  539.       0 1 charset length 1 sub {
  540.     dup CharStringArray exch get
  541.     exch charset exch get idstring
  542.     CharStrings xxput
  543.       } for
  544.         % Remove unwanted entries.
  545.       currentdict /charset undef
  546.       currentdict /CharSetArray undef
  547.     end
  548.   } forall
  549.  
  550.     % Wrap up.
  551.  
  552.   resname mark 0 1 fonts length 1 sub {
  553.     dup names exch get exch fonts exch get
  554.     dup /FontName 3 index put
  555.     1 index exch definefont
  556.   } for .dicttomark
  557.   end        % temporary dict
  558.   end        % FontSetInit ProcSet
  559.   /FontSet defineresource pop
  560.  
  561. } bind def
  562.  
  563. % ---------------- Resource category definition ---------------- %
  564.  
  565. currentdict end readonly
  566.  
  567. languagelevel exch 2 .setlanguagelevel
  568.  
  569. /FontSet /Generic /Category findresource dup length dict .copydict
  570. /Category defineresource pop
  571.  
  572. /FontSetInit exch /ProcSet defineresource pop
  573.  
  574. .setlanguagelevel
  575.